/****************************************************
	文件：TemplateMethodPattern.cs
	作者：HuskyT
	邮箱：1005240602@qq.com
	日期：2020/5/5 20:14:51
	功能：模板方法模式
*****************************************************/

using UnityEngine;

namespace DesignPatterns
{
    public class TemplateMethodPattern : MonoBehaviour
    {
        private void Start()
        {
            //模板方法：
            //便于代码复用：
            //抽离出一个基类，将重复性代码放入基类；不同逻辑的部分，通过子类修改（多态）
            DeployerBase deployer = new SkillDeployer();
            deployer.Deploy();//释放技能
            deployer = new NormalAtkDeployer();
            deployer.Deploy();//释放技能
        }

        /// <summary>
        /// 技能部署器基类
        /// </summary>
        public abstract class DeployerBase
        {
            protected abstract void SearchTargets();
            protected abstract void DoLogic();
            protected abstract void DoView();
            public virtual void Deploy()
            {
                SearchTargets();//搜索目标
                DoLogic();//执行逻辑部分
                DoView();//执行表现部分
            }
        }
        /// <summary>
        /// 技能的部署器
        /// </summary>
        public class SkillDeployer : DeployerBase
        {
            protected override void SearchTargets()
            {
                Debug.Log("释放技能，搜索目标...");
            }
            protected override void DoLogic()
            {
                Debug.Log("释放技能，执行逻辑计算...");
            }
            protected override void DoView()
            {
                Debug.Log("释放技能，表现部分...");
            }
        }
        /// <summary>
        /// 普通攻击的部署器
        /// </summary>
        public class NormalAtkDeployer : DeployerBase
        {
            protected override void SearchTargets()
            {
                Debug.Log("普通攻击，搜索目标...");
            }
            protected override void DoLogic()
            {
                Debug.Log("普通攻击，执行逻辑计算...");
            }
            protected override void DoView()
            {
                Debug.Log("普通攻击，表现部分...");
            }
        }
    }
}
